#include "gtktextiterprivate.h"
#include "gtkdebug.h"
#include "gtktextmarkprivate.h"
+#include "gtktextsegment.h"
/*
* Types
* cleanup_line() below. See bug 317125.
*/
next2 = prev_seg->next->next;
- g_free ((char *)prev_seg->next);
+ _gtk_toggle_segment_free (prev_seg->next);
prev_seg->next = next2;
- g_free ((char *)seg);
+ _gtk_toggle_segment_free (seg);
seg = NULL;
}
else
seg->body.toggle.inNodeCounts = FALSE;
}
- g_free (seg);
+ _gtk_toggle_segment_free (seg);
/* We only clean up lines when we're done with them, saves some
gratuitous line-segment-traversals */
} \
} G_STMT_END
+#define PIXBUF_SEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
+ + sizeof (GtkTextPixbuf)))
+
+#define WIDGET_SEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
+ + sizeof (GtkTextChildBody)))
+
static GtkTextLineSegment *
pixbuf_segment_cleanup_func (GtkTextLineSegment *seg,
GtkTextLine *line)
if (seg->body.pixbuf.pixbuf)
g_object_unref (seg->body.pixbuf.pixbuf);
- g_free (seg);
+ g_slice_free1 (PIXBUF_SEG_SIZE, seg);
return 0;
}
};
-#define PIXBUF_SEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
- + sizeof (GtkTextPixbuf)))
-
GtkTextLineSegment *
_gtk_pixbuf_segment_new (GdkPixbuf *pixbuf)
{
GtkTextLineSegment *seg;
- seg = g_malloc (PIXBUF_SEG_SIZE);
+ seg = g_slice_alloc (PIXBUF_SEG_SIZE);
seg->type = >k_text_pixbuf_type;
child_segment_check_func /* checkFunc */
};
-#define WIDGET_SEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
- + sizeof (GtkTextChildBody)))
-
GtkTextLineSegment *
_gtk_widget_segment_new (GtkTextChildAnchor *anchor)
{
GtkTextLineSegment *seg;
- seg = g_malloc (WIDGET_SEG_SIZE);
+ seg = g_slice_alloc (WIDGET_SEG_SIZE);
seg->type = >k_text_child_type;
}
g_slist_free (seg->body.child.widgets);
-
- g_free (seg);
+
+ g_slice_free1 (WIDGET_SEG_SIZE, seg);
}
anchor->segment = NULL;
* Marks are typically created using the gtk_text_buffer_create_mark() function.
*/
+/*
+ * Macro that determines the size of a mark segment:
+ */
+#define MSEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
+ + sizeof (GtkTextMarkBody)))
static void gtk_text_mark_set_property (GObject *object,
guint prop_id,
"impending");
g_free (seg->body.mark.name);
- g_free (seg);
+ g_slice_free1 (MSEG_SIZE, seg);
mark->segment = NULL;
}
return seg->type == >k_text_left_mark_type;
}
-/*
- * Macro that determines the size of a mark segment:
- */
-
-#define MSEG_SIZE ((unsigned) (G_STRUCT_OFFSET (GtkTextLineSegment, body) \
- + sizeof (GtkTextMarkBody)))
-
-
static GtkTextLineSegment *
gtk_mark_segment_new (GtkTextMark *mark_obj)
{
GtkTextLineSegment *mark;
- mark = (GtkTextLineSegment *) g_malloc0 (MSEG_SIZE);
+ mark = g_slice_alloc0 (MSEG_SIZE);
mark->body.mark.name = NULL;
mark->type = >k_text_right_mark_type;
g_assert (gtk_text_byte_begins_utf8_char (text));
- seg = g_malloc (CSEG_SIZE (len));
+ seg = g_slice_alloc (CSEG_SIZE (len));
seg->type = (GtkTextLineSegmentClass *)>k_text_char_type;
seg->next = NULL;
seg->byte_count = len;
g_assert (gtk_text_byte_begins_utf8_char (text1));
g_assert (gtk_text_byte_begins_utf8_char (text2));
- seg = g_malloc (CSEG_SIZE (len1+len2));
+ seg = g_slice_alloc (CSEG_SIZE (len1+len2));
seg->type = >k_text_char_type;
seg->next = NULL;
seg->byte_count = len1 + len2;
return seg;
}
+static void
+_gtk_char_segment_free (GtkTextLineSegment *seg)
+{
+ if (seg == NULL)
+ return;
+
+ g_assert (seg->type == >k_text_char_type);
+
+ g_slice_free1 (CSEG_SIZE (seg->byte_count), seg);
+}
+
/*
*--------------------------------------------------------------
*
char_segment_self_check (new2);
}
- g_free (seg);
+ _gtk_char_segment_free (seg);
return new1;
}
if (gtk_get_debug_flags () & GTK_DEBUG_TEXT)
char_segment_self_check (newPtr);
- g_free (segPtr);
- g_free (segPtr2);
+ _gtk_char_segment_free (segPtr);
+ _gtk_char_segment_free (segPtr2);
return newPtr;
}
static int
char_segment_delete_func (GtkTextLineSegment *segPtr, GtkTextLine *line, int treeGone)
{
- g_free ((char*) segPtr);
+ _gtk_char_segment_free (segPtr);
return 0;
}
{
GtkTextLineSegment *seg;
- seg = g_malloc (TSEG_SIZE);
+ seg = g_slice_alloc (TSEG_SIZE);
seg->type = on ? >k_text_toggle_on_type : >k_text_toggle_off_type;
return seg;
}
+void
+_gtk_toggle_segment_free (GtkTextLineSegment *seg)
+{
+ if (seg == NULL)
+ return;
+
+ g_assert (seg->type == >k_text_toggle_on_type ||
+ seg->type == >k_text_toggle_off_type);
+
+ g_slice_free1 (TSEG_SIZE, seg);
+}
+
/*
*--------------------------------------------------------------
*
{
if (treeGone)
{
- g_free ((char *) segPtr);
+ _gtk_toggle_segment_free (segPtr);
return 0;
}
segPtr->body.toggle.info, -counts);
}
prevPtr->next = segPtr2->next;
- g_free ((char *) segPtr2);
+ _gtk_toggle_segment_free (segPtr2);
segPtr2 = segPtr->next;
- g_free ((char *) segPtr);
+ _gtk_toggle_segment_free (segPtr);
return segPtr2;
}
}
GtkTextLineSegment *_gtk_toggle_segment_new (GtkTextTagInfo *info,
gboolean on);
+void _gtk_toggle_segment_free (GtkTextLineSegment *seg);
G_END_DECLS